package novanok.com.tracktweet;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class MapReduceUsuarioMasTweetea {
    private Map<String, Integer> usuario = new TreeMap<String, Integer>();
    private static final double FACTOR_USUARIO = 0.2;

    private int limiteUsuario = 0;

    public MapReduceUsuarioMasTweetea (){ }

    public synchronized void analizar( String usuario ){
        synchronized (this.usuario) {
            String valor = usuario.toUpperCase();

            if ( this.usuario.get(valor) != null )
                this.usuario.put(valor, this.usuario.get(valor) + 1);
            else
                this.usuario.put(valor, 1);
        }

        this.purgar();
        this.actualizarLimite();
    }

    private synchronized void purgar(){
        synchronized (usuario) {
            if ( usuario.size() > 10 ){
                List<String> remove = new LinkedList<String>();
                for (Map.Entry<String, Integer> v : usuario.entrySet())
                    if (v.getValue() == limiteUsuario)
                        remove.add(v.getKey());

                for (String s : remove)
                    usuario.remove(s);
            }
        }
    }

    private synchronized void actualizarLimite(){
        Map<String, Integer> lista = getListaOrdenados();

        if ( lista != null && lista.values().size() > 0 )
            this.limiteUsuario = ( int )( ( double ) lista.values().iterator().next() * FACTOR_USUARIO );
    }

    public synchronized Map<String, Integer> getListaOrdenados(){
        return Comun.sortByValues(usuario);
    }

    public void clear() {
        usuario.clear();
    }
}
